package 富婆梦.第一阶段.Java基础视频学习.线程的练习.作业1;

import java.io.IOException;

/**
 * 定义一个全局int的值
 * 创建N个线程，每个线程都在各自的线程中对该int值减一，直到改值为0，各个线程停止
 * 在理解线程之后，可以把这个题目当做全局的int是一笔钱，每个线程都在疯狂取钱，但大家取的钱不能超过全局的钱。这里就是处理多线程的数据一致性
      addMemeber(),创建守护线程，每一个守护线程在余额不为0的时候可进行取钱操作
      checkMoney(),核实当前的余额，如果余额=0，则结束主进程，守护线程同时也会结束，程序终止
 */
public class MutilThreadRW {

    public static int money = 100;

    public static int threadCount = 5;

    public static void main(String[] args) throws IOException {
        // 请运行这个用例
        // 发现不合理的地方，解决它
        for (int i = 0; i < threadCount; i++) {
            addMemeber(i);
        }
        checkMoney();
        // 阻塞主线程
        //System.in.read();
        // 为什么要阻塞主线程？ 如果不阻塞主线程那么addMemeber方法运行5次之后就会停止，根本来不及花完100块钱
    }

    private synchronized static void addMemeber(int tag) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                while (money>0){
                    money--;
                    System.out.println(Thread.currentThread().getName()+":我花了一块钱，现在还剩下"+money);
                }
                System.out.println(Thread.currentThread().getName() + ":一块钱没花到，因为没钱了！");
            }
        });

        if (money>0){
            thread.setName("第" + tag + "线程");
            thread.setDaemon(true);
            thread.setPriority(6+tag);
            thread.start();
        }
    }

    private static void checkMoney() {
        try {
            Thread.sleep(50);
        }catch (Exception e){
            e.printStackTrace();
        }
        while (money>0){
            System.out.print("");
        }
        if (money==0){
            System.out.println("结束吧！没钱了！");
        }
    }
}
